package com.example.gatewayservice.utils;


import com.example.gatewayservice.exception.UnauthorizedException;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import org.springframework.stereotype.Component;

import javax.crypto.SecretKey;
import java.util.Date;


@Component
public class JwtTool {
    private static final SecretKey SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256);
    private static final String ISSUER = "yyz"; // 签发者标识符

//    /**
//     * 解析并验证JWT的有效性
//     *
//     * @param token 需要验证的JWT字符串
//     * @return 返回解析出来的用户ID
//     * @throws UnauthorizedException 如果token无效或验证失败则抛出异常
//     */
//    public static String parseAndValidateToken(String token) throws UnauthorizedException {
//        if (token == null || token.trim().isEmpty()) {
//            throw new UnauthorizedException("未登录");
//        }
//
//        Claims claims;
//        try {
//            claims = Jwts.parser()
//                    .setSigningKey(SECRET_KEY)
//                    .build()
//                    .parseClaimsJws(token)
//                    .getBody();
//        } catch (Exception e) {
//            throw new UnauthorizedException("无效的token", e);
//        }
//
//        // 检查签发者
//        String issuer = claims.getIssuer();
//        if (!ISSUER.equals(issuer)) {
//            throw new UnauthorizedException("非法的签发者");
//        }
//
//        // 检查过期时间
//        Date expiration = claims.getExpiration();
//        if (new Date().after(expiration)) {
//            throw new UnauthorizedException("token已过期");
//        }
//
//        // 检查主题（这里假设subject是userId）
//        String subject = claims.getSubject();
//        if (subject == null || subject.isEmpty()) {
//            throw new UnauthorizedException("token中缺少用户信息");
//        }
//
//        // 获取并返回userId
//        try {
//            return String.valueOf(parseLong(subject));
//        } catch (NumberFormatException e) {
//            throw new UnauthorizedException("token中的用户信息格式错误");
//        }
//    }

    public static ParsedToken parseAndValidateToken(String token) throws UnauthorizedException {
        if (token == null || token.trim().isEmpty()) {
            throw new UnauthorizedException("未登录");
        }

        Claims claims;
        try {
            claims = Jwts.parser()
                    .setSigningKey(SECRET_KEY) // 使用 SecretKey 对象
                    .build()
                    .parseClaimsJws(token)
                    .getBody();
        } catch (JwtException e) {
            throw new UnauthorizedException("无效的token", e);
        }

        // 校验签发者
        if (!ISSUER.equals(claims.getIssuer())) {
            throw new UnauthorizedException("非法的签发者");
        }

        // 校验过期时间
        if (new Date().after(claims.getExpiration())) {
            throw new UnauthorizedException("token已过期");
        }

        // 获取 subject（userId）
        String userId = claims.getSubject();
        if (userId == null || userId.isEmpty()) {
            throw new UnauthorizedException("token中缺少用户信息");
        }

        // 获取自定义字段 role
        String role = claims.get("role", String.class);
        if (role == null || role.isEmpty()) {
            throw new UnauthorizedException("token中缺少角色信息");
        }

        return new ParsedToken(userId, role);
    }

    // 封装解析结果
    public static class ParsedToken {
        private final String userId;
        private final String role;

        public ParsedToken(String userId, String role) {
            this.userId = userId;
            this.role = role;
        }

        public String getUserId() {
            return userId;
        }

        public String getRole() {
            return role;
        }
    }


}